/*
 * Copyright (c) 2024 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "core/components_ng/syntax/with_theme_node.h"

#include "core/components_ng/token_theme/token_theme_storage.h"
#include "core/pipeline/base/element_register.h"

namespace OHOS::Ace::NG {

WithThemeNode::~WithThemeNode()
{
    if (themeScopeDestroyCallback_) {
        themeScopeDestroyCallback_();
    }
    TokenThemeStorage::GetInstance()->RemoveThemeScope(GetId());
}

RefPtr<WithThemeNode> WithThemeNode::GetWithThemeNode(int32_t nodeId)
{
    return ElementRegister::GetInstance()->GetSpecificItemById<WithThemeNode>(nodeId);
}

RefPtr<WithThemeNode> WithThemeNode::CreateWithThemeNode(int32_t nodeId)
{
    auto node = MakeRefPtr<WithThemeNode>(nodeId);
    ElementRegister::GetInstance()->AddUINode(node);
    return node;
}

RefPtr<WithThemeNode> WithThemeNode::GetOrCreateWithThemeNode(int32_t nodeId)
{
    auto node = WithThemeNode::GetWithThemeNode(nodeId);
    if (!node) {
        node = WithThemeNode::CreateWithThemeNode(nodeId);
    }
    return node;
}

void WithThemeNode::NotifyThemeScopeUpdate()
{
    UINode::UpdateThemeScopeUpdate(GetThemeScopeId());
}

void WithThemeNode::UpdateThemeScopeId(int32_t themeScopeId)
{
    // do nothing
}

void WithThemeNode::UpdateThemeScopeUpdate(int32_t themeScopeId)
{
    // do nothing
}

void WithThemeNode::SetOnThemeScopeDestroy(ThemeScopeDestroyCallback&& callback)
{
    themeScopeDestroyCallback_ = std::move(callback);
}

void WithThemeNode::SetThemeScopeId(int32_t themeScopeId)
{
    if (themeScopeId_ == 0) {
        UINode::SetThemeScopeId(themeScopeId);
    }
}

} // namespace OHOS::Ace::NG